package com.arquitectonic.client.datosYlogica;

import java.util.Collection;
import java.util.HashMap;

import com.arquitectonic.client.extensiones.Gestor;
import com.arquitectonic.client.extensiones.Par;
import com.arquitectonic.client.servicios.Proxy;
import com.arquitectonic.compartido.Seccion;
import com.arquitectonic.compartido.ServerException;
import com.arquitectonic.compartido.Sugerencia;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DataSourceField;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.grid.ListGridRecord;

public class GestorSugerencias extends Gestor<Sugerencia> {

    private static GestorSugerencias instance = null;  
    
    public static GestorSugerencias getInstance() {  
        if (instance == null)
            instance = new GestorSugerencias();  
        return instance;  
    }      
    //DONE
    public GestorSugerencias() {  
    	super("Sugerencias");
    }

    //DONE
	public static void aplicarSugerencia(ListGridRecord sugerencia) {
		// TODO Auto-generated method stub
		if(sugerencia.getAttribute("tipo").equals(Sugerencia.SECCION_COMPLETA)){
			GestorSecciones.editarEstadoSeccion(sugerencia.getAttribute("nivel"),"DONE");
			getInstance().removerElemento(sugerencia.getAttribute("nivel"));
		}
	}

	static AsyncCallback<Collection<Seccion>> callbackGetSecciones = new AsyncCallback<Collection<Seccion>>() {
		@Override
		public void onSuccess(Collection<Seccion> result) {
			GestorSecciones.getInstance().cargarDatos(result);
			Proxy.getServicios().getTiposVistas(callbackGetTiposVistas);
		}
		@Override
		public void onFailure(Throwable caught) {
			SC.warn(caught.getMessage());
		}
	};
	
	static AsyncCallback<HashMap<String, Integer>> callbackGetTiposVistas = new AsyncCallback<HashMap<String, Integer>>() {

		@Override
		public void onSuccess(HashMap<String, Integer> result) {
			GestorVistas.cargarVistas(GestorSecciones.getInstance().getElementos(), GestorPreferencias.getElementos(),result);
			try {
				Proxy.getServicios().seguimientoPagina(callbackSeguimientoPagina);
			} catch (ServerException e) {
				e.printStackTrace();
			}
		}

		@Override
		public void onFailure(Throwable caught) {
			SC.warn("Problema obteniendo tipo de una vista.");
		}
	};
	static AsyncCallback<Collection<Sugerencia>> callbackSeguimientoPagina = new AsyncCallback<Collection<Sugerencia>>() {
       	@Override
		public void onSuccess(Collection<Sugerencia> result) {
       		Collection<Sugerencia> sugerencias=GestorVistas.getSugerencias();
       		System.out.println("Sugerencias falta seccion:");
       		for(Sugerencia s:sugerencias){
       			System.out.println(s.getNivel());
       		}
       		System.out.println("Sugerencias documentada seccion:");
       		for(Sugerencia s:result){
       			System.out.println(s.getNivel());
       		}
       		
       		sugerencias.addAll(result);
       		
       		GestorSugerencias.getInstance().cargarDatos(sugerencias);
       		
       	}
		@Override
		public void onFailure(Throwable caught) {
			SC.warn(caught.getMessage());
		}
	};	

	public static void seguirPaginaWiki(){
		try {
			Proxy.getServicios().getSecciones(callbackGetSecciones);
		} catch (ServerException e) {
			SC.warn(e.getMessage());
		}
	}
	

	@Override
	protected ListGridRecord toListGridRecord(Sugerencia d) {
		ListGridRecord r = new ListGridRecord();
		r.setAttribute("tipo", d.getTipo());
		r.setAttribute("descripcion", d.getDescripcion());
		r.setAttribute("nivel", d.getNivel());
		return r;
	}
	@Override
	protected Sugerencia toDato(Record r) {
		if(r.getAttribute("nivel").equals("-1"))
			return new Sugerencia(r.getAttribute("descripcion"));
		else
			return new Sugerencia(r.getAttribute("descripcion"),r.getAttribute("nivel"));
	}
	@Override
	protected boolean actualizarCampo(Par<Sugerencia, ListGridRecord> dato,
			String campo, Object valor) {
		return false;
	}
	@Override
	public String obtenerClave(Sugerencia dato) {
		return dato.getNivel();
	}
	@Override
	protected DataSourceField[] getDataSourceFields() {
    	//Campo descripcion:
    	DataSourceTextField descripcionSugerencia = new DataSourceTextField("descripcion", "Descripcion");
    	descripcionSugerencia.setPrimaryKey(true);
    	descripcionSugerencia.setRequired(true);
    	
        //Campo tipo:
        DataSourceTextField tipoSugerencia=new DataSourceTextField("tipo", "Tipo");
    	
    	//Campo nivel:
    	DataSourceTextField nivelSugerencia = new DataSourceTextField("nivel", "Nivel");
    	
		return new DataSourceField[] { descripcionSugerencia, tipoSugerencia, nivelSugerencia };
	}

}
